必装的库有:numpy、setuptools、dateutil、pyparsing、libpng、pytz、FreeType、cycler、six
1
| you-get --playlist --format=flv480 -o E:/StuDev/Program/JavaWeb https://www.bilibili.com/video/BV18s411u7EH
|
Java环境变量
- JAVA_HOME值:
- C:\Program Files\Java\jdk1.8.0_131(用JAVA_HOME指示jdk1.4的安装目录)。
- JRE_HOME值:
- C:\Program Files\Java\jdk1.8.0_131\jre
- PATH
- %JAVA_HOME%\bin;
Tomcat配置
Eclipse集成tomcat
- windows-preferences—-server-runtime-add-8.5-next-jre
- 面板-server-no…-8.5-next-finish
eclipse字体大小
点击“Window”,选择“Prefrences” , 点击“General”,点击“Appearance”,选择“Colors and Fonts” , 点击“Basic”,选择“Text Font” , 点击“Edit”
eclipse颜色
点击“Window”,选择“Prefrences” , 点击“Editors”,点击“Text Editors”,
Eclipse创建jsp项目
- file-new-other—–web-Dynamic Web-next-Target runtime(8.5)
前台页面使用的是 JSP,逻辑控制用的是 Struts 框架,数据库用的是 MySQL。进入每一个功能页面,首先是遍历数据库中与该功能相关的数据表,并且在 JSP 中使用 Struts 标签读存数据,前台数据提交都是以表单的方式提交到后台,然后在 Action 中调用 Dao 中的方法,将数据写入数据库中。
数据格式采用 Json 格式,在服务器端采用 Struts2 框架自带的 Json 包来解析数据并且存储到 MySQL 中。
ActionServlet 接受所有的 HTTP 请求, 然后根据配置文件
的内容, 决定将请求映射到哪一个 Action对象, 本系统中有两
个Action 对象, 分别对应着个人简历的提交( resumeAction) 和
用人单位的查询(queryAction) 。
resumeAction首先会验证用户是否已经登录, 如果没有登
录则重定向到登录页面( login.jsp), 验证通过后根据请求参数
决定下一步的处理, 如果是查看简历信息, 则调用 getResume 对
象把该用户的简历读取到FormBean 中, 然后调用 JSP 页面显示
Bean里的数据;如果是保存简历信息, 则调用 saveResume 对象
将FormBean 里保持的简历信息存入数据库
queryAction接收用户的查询请求, 调用 queryResume 对象
来执行实际的查询工作, 查询结果集放入一个列表对象中, 列
表里的每一项对应一个 queryResult 对象, 用来封装一条结果
记录, 这样在 JSP 页面里通过 Struts 提供的 iterate 标记就能够
逐条读取记录。 另外, 为了分页显示查询结果, 我们还定义了
一个 pageHead对象, 它封装了每次查询的总页数、当前页码、
总记录数, 以便在 JSP 页面中利用自定义的标记来显示分页
导航的链接信息。
为了在 JSP 页面的下拉列表里显示数据库字典表的内
容, 我们还事先创建好了 dictionaryTable 对象, 它里面封装了
几个列表对象, 每一个列表对应一个要读取的字典表内容, 这
样我 们 就 可 以 利 用 Struts 提 供 的 options 标 记 自 动 从
dictionaryTable 对象中读取记录了。
实例
一点教程:http://www.yiidian.com/struts2/ 源码地址:https://github.com/yiidiancom/struts2
登录案列:https://blog.csdn.net/linshenshijianlu/article/details/78052135?locationNum=3&fps=1
教程(附案例源码):https://blog.csdn.net/xusf1116/article/details/103817163?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
struts2
新建web项目
导入jar包 struts-2.5.25\lib WebRoot—WEB-IFb—lib
配置struts2核心控制器 web.xml
1
2
3
4
5
6
7
8
9
| <display-name></display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
|
在src下添加struts2核心配置文件,struts.xml 包含所有Action的定义
编写Action类
1
2
3
4
5
| public class HelloAction {
public String execute() {
System.out.println("hello");
return "success";
}
|
在servlet中,默认执行service方法
service方法参数HttpServletRequest和HttpServletResponse
在struts2中,默认执行execute方法
方法都是public的,并且返回值都是String类型,都是无参数的
配置action类—在struts.xml文件中,配置HelloAction Action执行的结果由Result结果处理器来处理
1
2
3
4
5
6
7
8
9
| <struts>
<!--extends必须写,继承struts-default name自定义-->
<package name="hello" extends="struts-default">
<action name="hello" class="cn.bri.action.HelloAction">
<!--result是结果集 neme和返回值匹配,默认success-->
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
|
过程
struts标签,这个标签系统和Template结合起来使用,实际上这款我们也了解过了,通过这些内容的学习,有这么一个印象,一个请求过来的时候,经过这个核心控制器,然后再找到具体的Action,Action去执行具体的业务逻辑,去调用具体的业务逻辑,最后在将结果返回给视图控制器Result来进行结果处理,之后返回到标签子系统去显示输出,最后再返回给我的浏览器。
用户登录案列
jar包:
struts2-core.jar
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <web-app>
<display-name></display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
|
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <struts>
<!--乱码解决-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!--自定义扩展名
<comstant name="struts.action.extension" value="action,,siggy"></comstant>-->
<!--设置开发模式:提示错误信息-->
<comstant name="struts.devMode" value="true"></comstant>
<!--文件修改后自动装载-->
<comstant name="struts.configuration.xml.reload" value="true"></comstant>
<!--团队协作开发include-->
<include file="config/bri/struts/user.xml"/>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="cn.bri.action.loginAction">
<result>/success.jsp</result>
<result name="failed">/login.jsp</result>
</action>
<action name="add" class="cn.bri.action.loginAction"></action>
</package>
</struts>
|
login.jsp
1
2
3
4
5
6
| <!--form action="login.siggy" method="post">-->
<form action="user/login.action" method="post">
用户名:<input type="text" name="name"/>
密码:<input type="submit" name="pwd"/>
<input type="submit" value="登录"/>
</form>
|
LoginAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| public class LoginAction {
private String name;
private String pwd;
public String execute() {
if("xingming".equals(name)&&"mima".equals(pwd))
return "success";
else{
return "login"
//return "failed"
}
}
public String logout(){
sout("退出");
return "success"
}
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
public String getPwd(){
return pwd;
}
public String setPwd(String pwd){
this.pwd = pwd;
}
|
注意:action="login.action"
与<url-pattern>*.action</url-pattern>
相匹配
src:
struts.properties
1
2
| #自定义扩展名
#struts.action.extension=action,,siggy
|
团队协作:
config.bri.struts:
user.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| <struts>
<!--
包名自定义,可以配置多个包
namespace命名空间:不同模块可以指定不同的空间
extends值是直接或间接继承struts-default
-->
<package name="user" namespace="/user" extends="struts-default">
<!--当action不存在时,执行默认action,避免难看-->
<default-action-ref name ="default"/>
<!--在action中,如果没有class将会执行默认class-->
<default-class-ref class="cn.bri.action.addAction"/>
<!--配置全局结果集:使用太多使用-->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<!--
name是url请求名,不需要加后缀(.action)和/
class是处理url请求对应的java类,class要求包名加类名,并且该类是由公共的无参构造方法的
method是配置处理请求类的方法,默认为execute,方法是公共的,返回值类型是String,无参
method与name无关,一样为了好记
-->
<action name="login" class="cn.bri.action.loginAction">
<!--
result:指结果集
name:匹配请求处理方法的返回值,默认是success
type:结果处理类型,
1.默认是dispather转发,和servlet一致。如果request中有数据要到视图显示,则使用
2.redirect重定向:重定向到jsp可以直接重定向;如果到另一个action,需注意是否配置了action的后缀名。如web.xml要求有,则重定向一定要加上后缀名 <url-pattern>*.action</url-pattern>
3.redirectAction:重定向到另一个action,不用加action后缀名,会讲前一个action后缀名自动加上
4.stream:以流的形式显示---文件下载
-->
<result type="redirect">logout.action</result>
<!--因为有全局结果集 (loginAction.java return "login")
<result name="login">/login.jsp</result>-->
</action>
<!--在loginAction添加方法logout()-->
<action name="logout" class="cn.bri.action.loginAction" method="logout">
<result>/index.jsp</result>
</action>
<!--在action中,如果没有class将会执行默认class-->
<action name="add" class="cn.bri.action.addAction" method="add">
<result>/index.jsp</result>
</action>
<action name="default">
<result>/error.jsp</result>
</action>
</package>
</struts>
|
config.bri.hibernate:
config.bri.spring:
AddAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public class AddAction {
public String add(){
sout("add")
return "success";
}
public String delete(){
sout("add")
return "success";
}
public String update(){
sout("add")
return "success";
}
}
|
error.jsp
1
2
3
| <body>
资源不存在
</body>
|
success.jsp
1
2
3
| <body>
${name}
</body>
|
Action实现方式
- 定义一个pojo类
- 实现action接口
- 继承ActionSupport类(后台验证功能:推荐使用;一般都是使用前台验证)
web.xml
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
| <struts>
<package name="hello" namespace="/" extends="struts-default">
<action name="pojo" class="cn.bri.action.pojoAction">
<result name="success">/index.jsp</result>
</action>
<action name="interface" class="cn.bri.action.interfaceAction">
<result>/index.jsp</result>
</action>
<action name="entends" class="cn.bri.action.extendsAction">
<result>/index.jsp</result>
</action>
</package>
</struts>
|
PojoAction.java
1
2
3
4
5
6
| public class PojoAction{
public String execute(){
sout("pojo");
return "success";
}
}
|
InterfaceAction.java
1
2
3
4
5
6
7
8
| //接口为了编写代码规范
public class InterfaceAction implements Action{
//jdk1.8不用写,有默认
public String execute() throws Exception{
sout("InterfaceAction");
return Action.SUCCESS;//none
}
}
|
ExtendsAction.java
1
2
3
4
5
6
7
8
| //继承什么都不写,就啥输出也没有
public class ExtendsAction entends ActionSupport{
@Override
public String execute() throws Exception{
sout("extendsAction");
return Action.SUCCESS;
}
}
|
属性驱动:处理表单数据方式
struts.xml
1
2
3
4
5
6
7
| <struts>
<package name="user" namespace="/" extends="struts-default">
<action name="register" class="cn.bri.action.UserAction" method="register">
<result name="success">/show.jsp</result>
</action>
</package>
</struts>
|
config.bri.entiny
User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public class User{
private String name;
private String pwd;
private int age;
private String email;
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
public String getPwd(){
return pwd;
}
public String setPwd(String pwd){
this.pwd = pwd;
}
...
}
|
config.bri.action
UserAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public class UserAction(){
private User user;
//注册
public String register(){
sout(user);
return Action.SUCCESS;
}
public String getUser(){
return user;
}
public String setUser(User user){
this.user = user;
}
//Generate toString()...快捷键
@Override
public String toString(){
return ......
}
}
|
register.jsp
1
2
3
4
5
6
7
8
9
| <body>
<form action="register.action" method="post">
用户名:<input type="text" name="user.name"/> <!--user.name-->
密码:<input type="password" name="user.pwd"/>
年龄:<input type="text" name="user.age"/>
邮箱:<input type="text" name="user.email"/>
<input type="submit" value="提交"/>
</form>
</body>
|
show.jsp
1
2
3
| <body>
${user}
</body>
|
模型驱动:处理表单数据方式
UserAction.java
User.java
UserModelAction.java
1
2
3
4
5
6
7
8
9
10
11
| //2 重点implements ModelDriven<User> new User() getModel(){return user}
public class UserModelAction implements ModelDriven<User>{//从页面表单返回User类型数据
private User user=new User();
public String register(){//从UserAction.java复制过来的
sout(user);
return Action.SUCCESS;
}
private User getModel(){
return user;
}
}
|
regModel.jsp
1
2
3
4
5
6
7
8
9
10
| <!--1 重点 name="name"... -->
<body>
<form action="regModel.action" method="post">
用户名:<input type="text" name="name"/>
密码:<input type="password" name="pwd"/>
年龄:<input type="text" name="age"/>
邮箱:<input type="text" name="email"/>
<input type="submit" value="提交"/>
</form>
</body>
|
struts.xml
1
2
3
4
5
6
7
8
9
10
| <struts>
<package name="user" namespace="/" extends="struts-default">
<action name="register" class="cn.bri.action.UserAction" method="register">
<result name="success">/show.jsp</result>
</action>
<action name="regModel" class="cn.bri.action.UserModelAction" method="regModel">
<result name="success">/show.jsp</result>
</action>
</package>
</struts>
|
属性驱动和模型驱动自选,都可以。模型驱动为了省力,不用写名称username="user.name"
,建议实体类属性多时使用
项目案例:增删改查
包结构
src | | |
---|
| cn.action | |
| | UserAction.java |
| cn.dao | |
| | UserDao.java |
| cn.entity | |
| | User.java |
| cn.service | |
| | UserService.java |
| cn.util | |
| | BaseDao.java(数据库连接信息) |
| struts.xml | |
WebRoot | | |
| WEB-INF | |
| | web.xml |
| index.jsp | |
| list.jsp | |
| login.jsp | |
| update.jsp | |
| error.jsp | |
| index.jsp | |
数据库 t_user
名 | 类型 |
---|
id | int |
name | varchar |
pwd | varchar |
User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| public class User{
private int id;
private String name;
private String pwd;
public User(){
}
//快捷键Generate Constructor using Fields
public User(String name,String pwd){//没有id也可以
super();
this.name = name;
this.pwd = pwd;
}//返回if(rs.next()){
public String getId(){
return name;
}
public String setId(String id){
this.id = id;
}
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
}
|
UserDao.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| public class UserDao extends BaseDao{
public User login(User u){
String sql="select * from t_user where name=? and pwd=?";
ResultSet rs = this.executeQuery(sql,u.getName(),u.getPwd());
try{
if(rs.next()){//判断是否为空
//在User.java中生成构造方法public User(){} public User(String name,String pwd){}
return new User(rs.getInt(1),rs.getString(2),rs.getString(3))//可能有错,try一下
}
} catch (SQLException e){
e.preintStackTrace();
}finally{
this.close();
}
return null;
}
public List<User> getList(){
String sql="select * from t_user;
List<User> list = new ArrayList<User>();
ResultSet rs = this.executeQuery(sql)
try{
while(rs.next()){
list.add(new User(rs.getInt(1),rs.getString(2),rs.getString(3)))
}
} catch (SQLException e){
e.preintStackTrace();
}finally{
this.close();
}
return list.size()>0?list:null;
}
//修改
public int update(User u){
String sql = "update t_user set name=?,pwd=? where id=?";
return this.executeQuery(sql,u.getName(),u.getPwd(),u.getId());
}
//查找 要更新先查找
public int getById(int id){
String sql="select * from t_user where id=?;
ResultSet rs = this.executeQuery(sql,id);
try{
if(rs.next()){
return new User(rs.getInt(1),rs.getString(2),rs.getString(3))
}
} catch (SQLException e){
e.preintStackTrace();
}finally{
this.close();
}
return null;
}
}
|
UserService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class UserService{
private UserDao userDao = new UserDao;
public User login(User u){
return userDao.login(u);
}
public List<User> getList(){
return userDao.getList();
}
public User update(User u){
return userDao.update(u);
}
public int getById(int id){
return userDao.getById(id);
}
}
|
UserAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| public class UserAction(){
private User user;
private List<User> list;
private UserService userService = new UserService();
//登录
public String login(){
User temp=userService.login(user);
if(temp!=null){
//list = userService.getList();不够好,和下面重复,直接list();
//return list();但是可能拦截器就用不了了
return Action.SUCCESS;//去struts.xml 添加type="redirectAction"
}
return Action.LOGIN;//登录失败
}
//获取用户列表在前台显示
public String list(){//要在前台显示,就要作为属性,并且要生成get方法
list = userService.getList();
return Action.SUCCESS;
}
//根据id查询用户,然后跳转到update.jsp
public String toUpdate(){
user=UserService.getById(user.getId());
return Action.SUCCESS;
}
//更新用户
public String update(){
int result=userService.update(user);
if(result>0){
return Action.SUCCESS;
}
return Action.ERROR;
}
public String getUser(){
return user;
}
public String setUser(User user){
this.user = user;
}
public List<User> getList(){
return list;
}
public List<User> setList(List<User> list){
this.list = list;
}
}
|
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <struts>
<package name="user" extends="struts-default">
<action name="login" class="cn.action.UserAction" method="login">
<result name="success" type="redirectAction">list</result>
<result name="login">/login.jsp</result>
</action>
<action name="list" class="cn.action.UserAction" method="list">
<result name="success">/list.jsp</result>
</action>
<action name="toUpdate" class="cn.action.UserAction" method="toUpdate">
<result>/update.jsp</result>
</action>
<action name="update" class="cn.action.UserAction" method="update">
<result type="redirectAction">list</result>
<result name="error">/error.jsp</result><!--去写error.jsp-->
</action>
</package>
</struts>
|
login.jsp
1
2
3
4
5
6
7
| <body>
<form action="login.action" method="post">
用户名:<input type="text" name="user.name"/>
密码:<input type="password" name="user.pwd"/>
<input type="submit" value="登录"/>
</form>
</body>
|
list.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <%taglib prefix="c" url="...jsp/jstl/core"%>
<body>
<table width="80%" align="center">
<tr>
<td>编号</td>
<td>姓名</td>
<td>密码</td>
<td>操作</td>
</tr>
<c:forEach items="${list }" var="bean">
<tr>
<td>${bean.id }</td>
<td>${bean.name }</td>
<td>${bean.pwd }</td>
<!--UserAction.java没有id属性,所以需要userr.id-->
<td><a href="toUpdate?user.id=${bean.id }">修改</a></td>
</tr>
<!--不显示,因为UserAction.java login()方法没有执行查询list = userService.getList();-->
</c:forEach>
</table>
</body>
|
update.jsp
1
2
3
4
5
6
7
8
| <body>
<form action="update.action" method="post">
<input type="hidden" name="user.id" value="${user.id}"/>
用户名:<input type="text" name="user.name" value="${user.name}"/>
密码:<input type="password" name="user.pwd" value="${user.pwd}"/>
<input type="submit" value="修改"/><!--去写配置文件-->
</form>
</body>
|
error.jsp
1
2
3
| <body>
修改失败
</body>
|
index.jsp
1
2
3
| <body>
<a href="login.jsp">登录</a>
</body>
|
双表怎么处理?
ServletAPI:Request
struts2有两种方式获取servletAPI,一种解耦,一种耦合;
解耦使得使用struts2来进行测试的时候,不需要启动服务器。在一定程度上提高开发效率
action—>service—>dao
使用解耦的方式来获取servletapi;通过ActionContext对象获取。
1
2
3
4
5
6
7
8
| //1获取session
ActionContext.getContext().getSession().put("user",name);
//2获取request-----HttpServletRequest对象的attributes
Map<String,Object> request = (MAp)ActionContext.getContext().get("request");
//3获取application
Map<String,Object> application = ActionContext.getContext().getApplication();
//4获取parameters,并输出试一试是否成功
Map<String,Object> parameters = ActionContext.getContext().getParameters();
|
通过ServletActionContext获取HttpServletRequest对象
1
2
3
| HttpServletRequest request=ServletActionContext.getRequest();
request.getSession().setAttribute("user",name);
sout("name===="+request.getParameters("name"));
|
LoginAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| public class LoginAction {
private String name;
private String pwd;
public String execute() {
if("xingming".equals(name)&&"mima".equals(pwd))
// 1推荐
//1获取session
//ActionContext.getContext().getSession().put("user",name);
////2获取request-----HttpServletRequest对象的attributes
//Map<String,Object> request = (MAp)ActionContext.getContext().get("request");
//3获取application
//Map<String,Object> application = ActionContext.getContext().getApplication();
//4获取parameters,并输出试一试是否成功
//Map<String,Object> parameters = ActionContext.getContext().getParameters();
//相当于request.getParameters("name");
//sout("name===="+parameters.get("name"));
// 2 重要
//HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(StrutsStatic.Http_REQUEST);
//request.getSession().setAttribute("user",name);
//sout("name===="+request.getParameters("name"));
// 3推荐
HttpServletRequest request=ServletActionContext.getRequest();
request.getSession().setAttribute("user",name);
sout("name===="+request.getParameters("name"));
return "success";
else{
return "login"
}
}
public String logout(){
//先获取数据,然后清空方法
ActionContext.getContext().getSession().remove("user");
sout("退出");
return "success"
}
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
public String getPwd(){
return pwd;
}
public String setPwd(String pwd){
this.pwd = pwd;
}
|
success.jsp
1
2
3
| <body>
用户名: ${user }--------<a href="logout.action">退出</a>
</body>
|
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
| <struts>
<package name="user" namespace="/" extends="struts-default">
<action name="login" class="cn.bri.action.loginAction">
<result>/success.jsp</result>
</action>
<action name="logout" class="cn.bri.action.loginAction" method="logout">
<result>/index.jsp</result>
</action>
<action name="default">
<result>/error.jsp</result>
</action>
</package>
</struts>
|
index.jsp
1
2
3
| <body>
<a href="login.jsp">登录</a>
</body>
|
login.jsp
1
2
3
4
5
6
7
| <body>
<form action="login.action" method="post">
用户名:<input type="text" name="user.name"/>
密码:<input type="password" name="user.pwd"/>
<input type="submit" value="登录"/>
</form>
</body>
|
类型转换
在servlet中,如果表单提交非字符串数据时,需进行类型转换:如提交age
1
2
3
4
| String strAge = req.getParameter("age");
int age = 0;
if(strAge!=null)
age=Integer.parseInt(strAge);
|
在struts2中,常见类型数据struts2已经自动进行了类型转换,无需程序员进行手动转换
在某些情况下,有自定义类型时,struts2不能完成类型转换,那么需要手动转换,如果该自定义类型使用较多时,手动转换重复代码将会增多———使用struts2提供的类型转换器来进行类型转换。
案列:比如坐标点 (x,y)
不进行类型转换的处理方式
代码:
struts.xml
1
2
3
4
5
6
7
| <struts>
<package name="default" extends="struts-default">
<action name="point" class="cn.action.PointAction">
<result>/index.jsp</result>
</action>
</package>
</struts><!--4-->
|
entity.Point.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public class Point {
private int x;
private int y;
public String getX(){
return x;
}
public String setX(String x){
this.x = x;
}
public String getY(){
return y;
}
public String setY(String y){
this.y = y;
}
}//1
|
action.PointAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class PointAction {
private Point point;
public String execute(){
sout(point.getX()+"--------"+point.getY());
return Action.SUCCESS;
}
public String getPoint(){
return point;
}
public String setPoint(String point){
this.point = point;
}
}//3
|
pointer.jsp
1
2
3
4
5
6
7
| <body>
<form action="point.action" method="post">
x:<input type="text" name="point.x"/><br>
y:<input type="text" name="point.y"/><br>
<input type="submit" value="提交"/><br>
</form>
</body><!--2-->
|
index.jsp
1
2
3
4
| <body>
x:<s:property value="point.x"/><br>
y:<s:property value="point.y"/><br>
</body><!--5-->
|
x y输入不符合数学的表达形式
使用类型转换的处理方式
- 编写类型转换器—继承StrutsTypeConverter类
- 编写xwork-conversion.properties的配置文件,放于src下;内容为要编写的类型=类型转换器
代码:
pointer.jsp
1
2
3
4
5
6
| <body>
<form action="point.action" method="post">
点:<input type="text" name="point"/><br>
<input type="submit" value="提交"/><br>
</form>
</body>
|
converter.PointConverter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| public class PointConverter extends StrutsTypeConverter{
/*
将表单提交的字符串数据转换为指定的自定义类型
context是ActionContext数据
values 要进行类型转换的字符串数组
toClass 被转换的类型
*/
@Override
public Object convertFromString(Map context,String[] values,Class toClass){
String value=values[0];
sout(value);
Point point = new Point();
String x=value.substring(1,value.indexOf(","))
String y=value.substring(value.indexOf(",")+1,value.length()-1);
//测试
//sout("x="+x);
//sout("y="+y);value.length()-1
point.setX(Interger.parseInt(x));
point.setY(Interger.parseInt(y));
return null;
}
//将自定义类型转换为字符串在前台显示,通过ognl表达式将会使用该方法转换,o为被转换数据
@Override
public String convertToString(Map context,Object o){
//1:点:<s:property value="point"/>
Point point = (Point)o;
return "("+point.getX()+","+point.getY()+")";
//2:return null;无返回值,不显示数据
}
}
|
xwork-conversion.properties
1
| cn.entity.Point=cn.converter.PointConverter
|
index.jsp
1
2
3
4
5
| <body>
x:<s:property value="point.x"/><br>
y:<s:property value="point.y"/><br>
点:${point }<!--写toString方法-->
</body>
|
action.PointAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| public class PointAction {
private Point point;
public String execute(){
sout(point.getX()+"--------"+point.getY());
return Action.SUCCESS;
}
public String getPoint(){
return point;
}
public String setPoint(String point){
this.point = point;
}
@Override
public String toString(){
return "(" + x + ",y=" + y + ")";
}
}
|
struts2的验证方式
一般都是写js客户端验证
服务端验证
如果action类继承了ActionSupport类,那么该action类将会继承ActionSupport的相关功能,如:验证功能
action.RegisterAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public class RegisterAction entends ActionSupport{
private String name;
private String pwd;
private int age ;
private Date birthday;
@Override
public String execute() throws Exception{
return Action.SUCCESS;
}
@Override
public String validete(){
super.validete();
}
//get(){}
//set(){}
}
|
…
验证框架
使用验证框架的步骤:在对应的action的包下添加一个验证框架的配置文件,该文件名为:actionName-validation.xml
案列:
action.RegisterValidateAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class RegisterAction entends ActionSupport{
private String name;
private String pwd;
private int age ;
private Date birthday;
@Override
public String execute() throws Exception{
sout("execute");
return Action.SUCCESS;
}
//get(){}
//set(){}
}
|
register.jsp
1
2
3
4
5
6
7
8
9
10
11
| <body>
<s:actiomerror/>
<s:fielderror></s:fielderror>
<form action="register.action" method="post">
用户名:<input type="text" name="name"/><br>
密码:<input type="text" name="pwd"/><br>
年龄:<input type="text" name="age"/><br>
生日:<input type="text" name="birthday"/><br>
<input type="submit" value="登录"/><br>
</form>
</body>
|
action.RegisterValidateAction-validation.xml
1
2
3
4
5
6
7
| <validators>
<field name="name"></field><!--验证谁就写谁名-->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名必填</message>
</field-validator>
</validators>
|
struts.xml
1
2
3
4
5
6
7
8
| <struts>
<package name="default" namespace="/" extends="struts-default">
<action name="register" class="cn.action.RegisterValidateAction">
<result>/index.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
</struts>
|
拦截器
与过滤器相似。