2025.3.24
今日学习内容:
-
Filter过滤器
实现用户登录验证Filter:
public class LoginFilter implements Filter
{
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession();// 检查用户是否已登录 if (session.getAttribute("user") == null) { request.getRequestDispatcher("/login.jsp").forward(req, res); } else { chain.doFilter(req, res); // 放行请求 } }
}
在web.xml中配置Filter:
2. Listener监听器
监听ServletContext、HttpSession和ServletRequest的创建与销毁
实现Session计数器:
public class SessionCounter implements HttpSessionListener
{
private static int activeSessions = 0;
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
System.out.println("新会话创建,当前活跃会话数: " + activeSessions);
}
public void sessionDestroyed(HttpSessionEvent se) {
activeSessions--;
System.out.println("会话销毁,当前活跃会话数: " + activeSessions);
}
}
收获:
学会使用Filter实现请求预处理和权限控制
掌握Listener监听Web应用事件,实现统计功能
理解了Filter链的执行顺序和原理
科技查询源程序代码:
package com.example.kejichaxun;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private EditText searchEditText;
private Button searchButton;
private RecyclerView recyclerView;
private PolicyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchEditText = findViewById(R.id.searchEditText);
searchButton = findViewById(R.id.searchButton);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
searchButton.setOnClickListener(v -> {
String keyword = searchEditText.getText().toString().trim();
new Thread(() -> {
PolicyDBHelper dbHelper = new PolicyDBHelper();
List<Policy> policies = dbHelper.searchPolicies(keyword);
runOnUiThread(() -> {
adapter = new PolicyAdapter(policies, this);
recyclerView.setAdapter(adapter);
});
}).start();
});
}
}
package com.example.kejichaxun;
public class Policy {
private long id;
private String name;
private String text;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "Policy{" +
"id=" + id +
", name='" + name + '\'' +
", text='" + text + '\'' +
'}';
}
}
package com.example.kejichaxun;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class PolicyAdapter extends RecyclerView.Adapter<PolicyAdapter.ViewHolder> {
private List
private Context context;
public PolicyAdapter(List<Policy> policies, Context context) {
this.policies = policies;
this.context = context;
Log.d("PolicyAdapter", "接收到的政策数量: " + policies.size()); // 添加日志输出
}
@NonNull // 导入正确的注解
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_policy, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 导入正确的注解
Policy policy = policies.get(position);
holder.nameTextView.setText(policy.getName());
holder.itemView.setOnClickListener(v -> {
Intent intent = new Intent(context, PolicyDetailActivity.class);
intent.putExtra("policy_text", policy.getText());
context.startActivity(intent);
});
}
@Override
public int getItemCount() {
return policies.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView nameTextView;
public ViewHolder(@NonNull View itemView) { // 导入正确的注解
super(itemView);
nameTextView = itemView.findViewById(R.id.nameTextView);
}
}
}
package com.example.kejichaxun;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
public class PolicyDetailActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_policy_detail);
webView = findViewById(R.id.webView);
String policyText = getIntent().getStringExtra("policy_text");
webView.loadData(policyText, "text/html; charset=utf-8", null);
}
}
<EditText
android:id="@+id/searchEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="搜索政策关键词"/>
<Button
android:id="@+id/searchButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="搜索"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/nameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"/>

浙公网安备 33010602011771号